package
{
	import flash.external.ExternalInterface;
	import flash.utils.getQualifiedClassName;
	
	import mx.collections.ArrayCollection;
 
	public class SyncFW extends FlexFW
	{
		public var url:String = "";
		public var result:String;
		public var method:String;
		
  
	public function SyncFW(objRoot:Object)
	{
		super(objRoot,"SYNC");
		this.url = url;
		this.method = method;
	}

	public override function constructorSYNC(host:String,metodo:String):void
	{
		this.url = host;
		this.method = metodo;
	}
	
	public function execute(accion:String, ... args):*
	{
		var numParam:int = 1;
		var objEnviar:Object = new Object();
		var tiempo:Date = new Date();
		var params:String = "";
		objEnviar["t"] = tiempo.getTime().toString();
		objEnviar["a"] = accion;
		for each(var obj:* in args)
		{
			objEnviar["p["+(numParam++).toString()+"]"] = Serializer.serialize( obj );
		}
		var coma:String = "";
		for( var i:String in objEnviar )
		{
			params += coma + i + "=" + objEnviar[i];
			coma = "&";
		}
		var salida:* = Serializer.unserialize( send( params ) );
		if( salida.hasOwnProperty("error") )
			return false;
		if( salida.hasOwnProperty("data") )
			return salida.data;
		return salida;
	}
	  
	public function send(data:String=null):String
	{
		var code:String = sendingData(data);
		result = ExternalInterface.call(code);
		return result;
	}
	
	
	/**
	 * 	Recibe un objeto con los atributos iguales a los campos de una tabla y lo guarda
	 * 	Manda llamar a PHP
	 * 
	 */
	public override function inserts(objeto:Object,guardarEn:String=""):*
	{
		var salida:* = null;
		var objetoEnviar:Object;
		if(esContenedor(objeto))
		{
			objetoEnviar = forma2Object(objeto);
			salida = execute("altaObjeto",objetoEnviar,getQualifiedClassName(objetoEnviar));
		}
		else if(getQualifiedClassName(objeto)=="Array")
		{
			var objArre:Array = objeto as Array;
			var j:int;
			if(arrayMultiDim(objArre))
			{
				if(guardarEn)
				{
					for(j=0;j<objArre.length;j++)
					{
						var arreglo:Array = objArre[j];
						arreglo["nombreClase"] = guardarEn;
						salida = execute("altaObjeto",arreglo,"DynamicClase");
					}
				}
				else
				{
					for(j=0;j<objArre.length;j++)
					{
						var arreglo:Array = objArre[j];
						salida = execute("altaObjeto",arreglo,"DynamicClase");
					}
				}
			}
			else
			{
				if(guardarEn)
					objArre["nombreClase"] = guardarEn;
				salida = execute("altaObjeto",objArre,"DynamicClase");
			}
		}
		else if(getQualifiedClassName(objeto)=="mx.collections::ArrayCollection")
		{
			var objArr:ArrayCollection = objeto as ArrayCollection;
			var j:int;
			if(guardarEn)
			{
				for(j=0;j<objArr.length;j++)
				{
					var arreglo:Array = objArr[j];
					arreglo["nombreClase"] = guardarEn;
					salida = execute("altaObjeto",arreglo,"DynamicClase");
				}
			}
			else
			{
				for(j=0;j<objArr.length;j++)
				{
					var arreglo:Array = objArr[j];
					salida = execute("altaObjeto",arreglo,"DynamicClase");
				}
			}
			
		}
		else if(objeto.hasOwnProperty("selectedItem"))
		{
			objetoEnviar = element2Object(objeto);
			salida = execute("altaObjeto",objetoEnviar,getQualifiedClassName(objetoEnviar));
		} 
		else
		{
			salida = execute("altaObjeto",objeto,getQualifiedClassName(objeto));
		}
		return salida;
	}
	
	
	public function deletes(objeto:Object):*
	{
		var salida:* = null;
		var objetoEnviar:Object;
		if(esContenedor(objeto))
		{
			objetoEnviar = forma2Object(objeto);
			salida = execute("bajaObjeto",objetoEnviar,getQualifiedClassName(objetoEnviar));
		}
		else if(objeto.hasOwnProperty("selectedItem"))
		{
			objetoEnviar = element2Object(objeto);
			var arrCol:ArrayCollection = objeto.dataProvider;
			arrCol.removeItemAt(objeto.selectedIndex);
			objeto.dataProvider = arrCol;
			salida = execute("bajaObjeto",objetoEnviar,getQualifiedClassName(objetoEnviar));
		} 
		else
		{
			salida = execute("bajaObjeto",objeto,getQualifiedClassName(objeto));
		}
		return salida;
	}
	
	
	public function updates(objeto:Object,objetoBusqueda:Object=null,todo:Boolean=true):*
	{
		var salida:* = null;
		var objetoEnviar:Object;
		if(esContenedor(objeto))
			objetoEnviar = forma2Object(objeto);
		else if(objeto.hasOwnProperty("selectedItem"))
			objetoEnviar = element2Object(objeto);
		else
			objetoEnviar = objeto;
		if(objetoBusqueda==null)
		{
			salida = execute("cambioObjeto",objetoEnviar,getQualifiedClassName(objetoEnviar),false,false,todo);
		}
		else
		{
			if(esContenedor(objeto))
			{
				var objetoBuscar:Object = forma2Object(objetoBusqueda);
				salida = execute("cambioObjeto",objetoEnviar,getQualifiedClassName(objetoEnviar)
									,objetoBuscar,getQualifiedClassName(objetoBuscar),todo);
			}
			else
			{
				salida = execute("cambioObjeto",objetoEnviar,getQualifiedClassName(objetoEnviar)
									,objetoBusqueda,getQualifiedClassName(objetoBusqueda),todo);
			}
		}
		return salida;	
	}
	
	
	public function query(query:String,objeto1:Object=null,useClassNameAsTableName:Boolean=false,objetoBusqueda:Object=null):*
	{
		var salida:* = null;
		if(query.indexOf("OBJETO1")>=0)
		{
			if(query.indexOf("OBJETO2")>=0)
			{
				salida = execute("ejecutarQuery",query,objeto1,getQualifiedClassName(objeto1),true,objetoBusqueda,getQualifiedClassName(objetoBusqueda));
			}
			else
			{
				if(useClassNameAsTableName)
				{
					salida = execute("ejecutarQuery",query,objeto1,getQualifiedClassName(objeto1),true);
				}
				else
				{
					salida = execute("ejecutarQuery",query,objeto1,getQualifiedClassName(objeto1));
				}
			}
		}
		else
		{
			if(query=="*")
			{
				if(useClassNameAsTableName)
				{
					salida = execute("ejecutarQuery",query,objeto1,getQualifiedClassName(objeto1),true);
				}
				else
				{
					salida = execute("ejecutarQuery",query,objeto1,getQualifiedClassName(objeto1));
				}
			}
			else
			{
				salida = execute("ejecutarQuery",query);
			}		
		}
		return salida;
	}
	
	
	public function search(objeto:Object):*
	{
		var salida:* = null;
		if(esContenedor(objeto))
		{
			var objetoEnviar:Object = forma2Object(objeto);
			if( objetoEnviar.hasOwnProperty( "nombreClase" ) )
			{
				salida = execute("buscarObjeto",objetoEnviar,objetoEnviar["nombreClase"]);
			}
			else
			{
				salida = execute("buscarObjeto",objetoEnviar,getQualifiedClassName(objetoEnviar));
			}
		}
		else
		{
			if( objeto.hasOwnProperty( "nombreClase" ) )
			{
				salida = execute("buscarObjeto",objeto,objeto["nombreClase"]);
			}
			else
			{
				salida = execute("buscarObjeto",objeto,getQualifiedClassName(objeto));
			}
		}
		return salida;
	}
	
	
	public override function getObject(tipo:String):*
    {
    	var salida:* = null;
		if( ! this.arrFunciones.hasOwnProperty("pedirObjeto") )
		{
			this.arrFunciones["pedirObjeto"] = objetoCargar;
		}
		salida = execute("pedirObjeto",tipo);
    	return salida;
    }
	
	  
	private function sendingData(data:String=""):String
	{
		if(ExternalInterface.available)
		{
			var data:String = "function()" + 
							"{" + 
								"var xmlHttp;"+
								"try" + 
								"{"+             
									" xmlHttp = new ActiveXObject('Msxml2.XMLHTTP');" +                                     
								"}"+
								"catch(e)" + 
								"{" + 
									"try" + 
									"{" + 
										"xmlHttp=new ActiveXObject('Microsoft.XMLHTTP');" + 
									"}" + 
									"catch(oc)" + 
									"{" + 
										"xmlHttp=null;" + 
									"}" +             
								"}" + 
								"if(!xmlHttp && typeof XMLHttpRequest != 'undefined')" + 
								"{" + 
									"xmlHttp=new XMLHttpRequest();" + 
								"}"+
								"try" + 
								"{" + 
									"xmlHttp.open('"+ method + "','" + url + "',false);"+
									"xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');"+
									"xmlHttp.send('"+ data + "');"+
									"return xmlHttp.responseText;" +            
								"}"+
								"catch(x){alert(x)}" +         
							"}";
			return data; 
			}
			else
			{
				throw new Error("This browser is not supported.");
			}      
		}    
	}
}